
<%@include file="common.jsp" %>

<%//set client no cache
	response.setHeader("Pragma", "No-cache");
	response.setHeader("Cache-Control", "no-cache");
	response.setDateHeader("Expires", 1);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="Expires" content="0"/>
<meta http-equiv="Cache-Control" content="no-cache"/>
<meta http-equiv="Pragma" content="no-cache"/>
<title>请选择</title>

<script>

var gbpTree;
$(function(){

	var url = "${tree.url}";
	var queryString = "${tree.queryString}";
	var checkbox='${tree.checkbox}'=='true';

	if (!isEmpty(queryString)) {
		queryString = queryString.replace("{","");
		queryString = queryString.replace("}","");
		queryString = queryString.replace(",","&");
		if (url.indexOf("?") >= 0) {
			queryString = "&" + queryString;
	        
	    } else {
	    	queryString = "?" + queryString;
	    }
	}
	
	gbpTree=$('#treeLoc').tree({
	    url: url + queryString,
	    checkbox: checkbox,	
	    onClick: function(node){
	    	hitGBPTree(node.id,node.data,node.depth,gbpTree.tree('isLeaf',node.target),node.attributes);
	    },
	    onBeforeExpand: function(node) {
			return beforeExpandGBPTree(node);	// 默认返回true，即允许展开下层节点
	    }
	});
});

//是否只能选择底级节点
var returnLeaf='${tree.returnLeaf}';

//返回数据的最小级次
var minReturnLevel='${tree.minReturnLevel}';

//返回数据的最大级次
var maxReturnLevel='${tree.maxReturnLevel}';

//回调函数，负责处理对树状节点的点击事件
function hitGBPTree(code,txt,deep,isleaf,attributes){

	//如果该窗体用在其他窗体的iframe里，那么父窗体需要实现hitTree函数，以便调用
	//如果该窗体用来做弹出窗口，它的parent就是它本身，会调用下面的hitTree函数
	try {
		parent.hitTree(code,txt,deep,isleaf,attributes);

	} catch(e) {
		// 假定主页没有定义该函数，直接返回;
		return;
	}
}

//回调函数，负责处理对弹出树返回数据(适用于直接返回数据)
function hitTree(code,txt,deep,isleaf,attributes){

	if (code == '0') return;	// 如果用户选中根节点，则直接返回，防止用户选择根节点

	//如果只能选择底级节点,返回
	if(returnLeaf=='true'&&isleaf==false){
		return;
	}

	//如果不能选择根节点,返回
	if(minReturnLevel=='0' && deep=='0'){
		return;
	}

	var param = {code:code,txt:txt,deep:deep,isleaf:isleaf,attributes:attributes};
	
	window.returnValue = param;
	window.close();
}

function beforeExpandGBPTree(node) {
	try {
		if (maxReturnLevel) {
			if (maxReturnLevel == node.attributes.fjc) 
				return false;
		}		
		return parent.beforeExpand(node);
	} catch(e) {
		return true;	// 发生异常，假定客户端程序没有定义该事件函数。
	}
}

function beforeExpand(node) {
	return true;
}

//定位树操作,如果定位码不为空则进行定位操作
function locate(node){	    
	var targetNode = $("div[node-id=" +node.id + "]");
	targetNode.trigger("click.tree");
}

/**
 * 新增节点<p>
 *
 * @param id: 新增的树节点ID
 * @param text: 新增的树节点显示文本
 * @param data: 新增节点的业务信息
 */
function createNode(id,text,data) {

	var attr = {};
	for (var k in data) {
		attr[k] = data[k];
	}
	var newNode = {
			"id": id, 
			"text": text, 
			"attributes": attr
	};

	var selectedNode = getSelecdedNode();
	if (selectedNode){
		var newNodeArray = [newNode];	// 将node对象添加到数组中
		gbpTree.tree('append', {
      		parent: selectedNode.target,
      		data:  newNodeArray
  		});
	}

	// 创建节点成功后，自动触发新建节点的父节点的点击事件
	locate(selectedNode);
}

/**
 * 更新树节点信息。<p>
 *
 * @param id: 新增的树节点ID
 * @param text: 新增的树节点显示文本
 * @param data: 新增节点的业务信息
 */
function updateNode(id,text,data) {

	var attr = {};
	for (var k in data) {
		attr[k] = data[k];
	}
	
	var updateNode = getSelecdedNode();
	updateNode = $.extend({}, updateNode, {
		"id": id, 
		"text": text, 
		"attributes": attr
	});
	
	gbpTree.tree('update', updateNode);
	
	locate(updateNode);
}

/**
 * 删除给定的树节点.<p>
 *
 * @param node: 需要删除的树节点node对象，如果node对象为null，则默认删除当前选中的树节点。
 */
function deleteNode(node) {

	var selectedNode;
	if (node == null) {
		selectedNode = getSelecdedNode();

	} else {
		selectedNode = node;
	}
	
	var parentNode = getParentNode(selectedNode);
	
	if (selectedNode){
		gbpTree.tree('remove', $("div[node-id=" + selectedNode.id + "]")[0]);
	}

	// 删除节点成功后，自动触发删除节点的父节点点击事件
	locate(parentNode);
	
}

/**
* 展开给定的树节点.<p>
*
* @param node: 需要展开的树节点node对象，如果node对象为null，则默认展开当前选中的树节点。
*/
function expandNode(node) {

	var selectedNode;
	if (node == null) {
		selectedNode = getSelecdedNode();

	} else {
		selectedNode = node;
	}
	
	selectedNode = getSelecdedNode();
	gbpTree.tree('expand', $("div[node-id=" + selectedNode.id + "]")[0]);
}

/**
* 展开给定的树节点下的所有节点.<p>
*
* @param node: 需要展开的树节点node对象，如果node对象为null，则默认展开当前选中的树节点。
*/
function expandAll(node) {

	var selectedNode;
	if (node == null) {
		selectedNode = getSelecdedNode();

	} else {
		selectedNode = node;
	}

	gbpTree.tree('expandAll', $("div[node-id=" + selectedNode.id + "]")[0]);
}

/**
* 获取当前选定的树节点<p>
*
* @return 返回当前选中的树节点node对象。
*/
function getSelecdedNode() {
	var selectedNode = gbpTree.tree('getSelected');
	return selectedNode;
}

/**
 * 根据给定的node节点，获取该节点的父节点<p>
 *
 * @param node: 树节点node对象
 *
 * @return 返回传入node节点的父节点
 */
function getParentNode(node) {
	var param = $("div[node-id=" + node.id + "]")[0];
	var parentNode = gbpTree.tree('getParent', param);
	return parentNode;
}

/**
 * 获取所有复选框选中的节点.<p>
 * 
 * @return 返回node节点数组
 */
function getCheckedNode() {
	var nodes = gbpTree.tree('getChecked');
	return nodes;
}

/**
 * 获取所有复选框选中的节点的 ID.<p>
 * 
 * @return 返回node节点 ID 数组
 */
function getCheckedNodeIds() {
	var nodes = gbpTree.tree('getChecked');
	var nodeIds = [];
	for (var i = 0; i < nodes.length; i++ ) {
		nodeIds.push(nodes[i].id);
	}
	return nodeIds;
}

/**
 * 根据给定node节点对象，判断该节点是否为叶子节点.<p>
 *
 * @return 返回boolean值。true：表示叶子节点；false：表示非叶子节点。
 */
function isLeaf(node) {
	
	return gbpTree.tree('isLeaf',node.target);
}
 
</script>
</head>

<body>

<ul id="treeLoc"></ul>

</body>
</html>
